package com.leyou.trade.service.impl;

import com.leyou.common.exceptios.LyException;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartRepository;
import com.leyou.trade.service.CartService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author 虎哥
 */
@Service
public class CartServiceImpl implements CartService {

    private final CartRepository cartRepository;

    public CartServiceImpl(CartRepository cartRepository) {
        this.cartRepository = cartRepository;
    }

    @Override
    public void addCartItem(CartItem cartItem) {
        // 1.先判断商品是否存在，存在则修改数量，不存在则返回
        cartItem = loadCartNum(cartItem);
        // 3.保存
        cartRepository.save(cartItem);
    }

    private CartItem loadCartNum(CartItem cartItem) {
        // 1.根据商品id，尝试获取购物车商品
        Optional<CartItem> optional = cartRepository.findById(cartItem.getSkuId());
        // 2.判断是否存在
        if (optional.isPresent()) {
            // 记录要新增的商品数量
            Integer num = cartItem.getNum();
            // 如果存在，获取这个商品
            cartItem = optional.get();
            // 修改数量
            cartItem.setNum(num + cartItem.getNum());
        }
        return cartItem;
    }

    @Override
    public List<CartItem> queryCartList() {
        return cartRepository.findAll();
    }

    @Override
    public void updateNum(Long skuId, Integer num) {
        // 查询商品
        Optional<CartItem> optional = cartRepository.findById(skuId);
        // 判断
        if(!optional.isPresent()){
            // 购物车商品不存在
            throw new LyException(400, "购物车商品不存在！");
        }
        // 可以修改
        CartItem cartItem = optional.get();
        cartItem.setNum(num);
        // 保存
        cartRepository.save(cartItem);
    }

    @Override
    public void addCartItemList(List<CartItem> itemList) {
        // 批量更新商品的数量
        itemList = itemList.stream().map(this::loadCartNum).collect(Collectors.toList());
        // 批量写入
        cartRepository.saveAll(itemList);
    }
}
